//#include <iostream>
//#include <algorithm>
//#include <string>
//#include <unordered_map>
//
//using namespace std;
//
//int main()
//{
//    int p;
//    cin >> p;
//    while (p--)
//    {
//        int n;
//        string str;
//        cin >> n;
//        cin >> str;
//        int k = n / 4;
//        unordered_map<char, int> hash;
//        for (int i = 0; i < n; i++)
//        {
//            hash[str[i]]++;
//        }
//        long long sum = 0;
//        char s = 'A';
//        int j = n - k * 4;
//        for (int i = 0; i < 4; i++)
//        {
//            sum += min(hash[s + i], k);
//            if (j && hash[s + i] > k)
//            {
//                sum++;
//                j--;
//            }
//        }
//        cout << sum << endl;
//    }
//    return 0;
//}
//
//#include <iostream>
//#include <algorithm>
//#include <string>
//#include <vector>
//#include <unordered_map>
//
//using namespace std;
//
//int main()
//{
//    int n;
//    cin >> n;
//    vector<int> v(n);
//    for (int i = 0; i < n; i++)
//    {
//        cin >> v[i];
//    }
//    int k;
//    cin >> k;
//    int left = 0;
//    int right = 0;
//    long long max_buffer = 0;
//    long long sum = 0;
//    while (right < n)
//    {
//        sum += v[right];
//        while (right - left + 1 > k)
//        {
//            sum -= v[left];
//            left++;
//        }
//        max_buffer = max(sum, max_buffer);
//        right++;
//    }
//    cout << sum << endl;
//    return 0;
//}
//
//#include <iostream>
//using namespace std;
//
//int dx[4] = { 0,0,1,-1 };
//int dy[4] = { 1,-1,0,0 };
//int n;
//bool dp[510][510] = { false };
//int board[510][510] = { 0 };
//int ret = 0;
//
//void dfs(int x, int y, int k)
//{
//    if (x == n - 1 && y == n - 1)
//    {
//        ret = min(ret, k);
//        return;
//    }
//    dp[x][y] = true;
//    for (int i = 0; i < 4; i++)
//    {
//        int x1 = x + dx[i];
//        int y1 = y + dy[i];
//        if (x1 > 0 && x1 < n && y1>0 && y1 < n && !dp[x1][y1])
//        {
//            dfs(x1, y1, max(k, board[x1][y1]));
//        }
//    }
//    dp[x][y] = false;
//}
//
//int main()
//{
//    cin >> n;
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            cin >> board[i][j];
//        }
//    }
//    ret = board[0][0];
//    dfs(0, 0, ret);
//    cout << ret << endl;
//    return 0;
//}
//
//#include <iostream>
//#include <climits>
//using namespace std;
//
//int dx[4] = { 0,0,1,-1 };
//int dy[4] = { 1,-1,0,0 };
//int n;
//bool dp[510][510] = { false };
//int board[510][510] = { 0 };
//int ret = INT_MAX;
//
//void dfs(int x, int y, int k)
//{
//    if (x == n - 1 && y == n - 1)
//    {
//        ret = min(ret, k);
//        return;
//    }
//    k = max(k, board[x][y]);
//    int j[4] = { 0 };
//    dp[x][y] = true;
//    for (int i = 0; i < 4; i++)
//    {
//        int x1 = x + dx[i];
//        int y1 = y + dy[i];
//        if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < n && !dp[x1][y1])
//        {
//            j[i] = board[x1][y1];
//        }
//        else
//        {
//            j[i] = INT_MAX;
//        }
//    }
//    int p = 0;
//    for (int i = 0; i < 4; i++)
//    {
//        if (j[i] < j[p])
//        {
//            p = i;
//        }
//    }
//    if (x + dx[p] >= 0 && x + dx[p] < n && y + dy[p] >= 0 && y + dy[p] < n && !dp[x + dx[p]][y + dy[p]])
//    {
//        dfs(x + dx[p], y + dy[p], k);
//    }
//    dp[x][y] = false;
//}
//
//int main()
//{
//    cin >> n;
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            cin >> board[i][j];
//        }
//    }
//    dfs(0, 0, board[0][0]);
//    cout << ret << endl;
//    return 0;
//}
//
#include <iostream>
#include <climits>
using namespace std;

int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int n;
bool dp[510][510] = { false };
int board[510][510] = { 0 };
int ret = INT_MAX;

void dfs(int x, int y, int k)
{
    if (x == n - 1 && y == n - 1)
    {
        ret = min(ret, k);
        return;
    }
    dp[x][y] = true;
    for (int i = 0; i < 4; i++)
    {
        int x1 = x + dx[i];
        int y1 = y + dy[i];
        if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < n && !dp[x1][y1])
        {
            dfs(x1, y1, max(k, board[x][y]));
        }
    }
    dp[x][y] = false;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> board[i][j];
        }
    }
    dfs(0, 0, board[0][0]);
    cout << ret << endl;
    return 0;
}

//#include <iostream>
//#include <climits>
//using namespace std;
//
//int dx[4] = { 0,0,1,-1 };
//int dy[4] = { 1,-1,0,0 };
//int n;
//bool dp[510][510] = { false };
//int board[510][510] = { 0 };
//int ret = INT_MAX;
//
//void dfs(int x, int y, int k)
//{
//    if (x == n - 1 && y == n - 1)
//    {
//        ret = min(ret, k);
//        return;
//    }
//    int j[4] = { 0 };
//    dp[x][y] = true;
//    for (int i = 0; i < 4; i++)
//    {
//        int x1 = x + dx[i];
//        int y1 = y + dy[i];
//        if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < n && !dp[x1][y1])
//        {
//            j[i] = board[x1][y1];
//        }
//        else
//        {
//            j[i] = INT_MAX;
//        }
//    }
//    int p = 0;
//    for (int i = 0; i < 4; i++)
//    {
//        if (j[i] < j[p])
//        {
//            p = i;
//        }
//    }
//    if (x + dx[p] >= 0 && x + dx[p] < n && y + dy[p] >= 0 && y + dy[p] < n && !dp[x + dx[p]][y + dy[p]])
//    {
//        dfs(x + dx[p], y + dy[p], max(k, board[x + dx[p]][y + dy[p]]));
//    }
//    dp[x][y] = false;
//}
//
//int main()
//{
//    cin >> n;
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            cin >> board[i][j];
//        }
//    }
//    dfs(0, 0, board[0][0]);
//    cout << ret << endl;
//    return 0;
//}
